1、第几天

题目 第几天

image-266f5bc8

思路分析

日期问题 组合拳

用nextday直到某天的判断技巧

cury == 2000:这个条件确保循环只在2000年内进行。一旦年份超过2000年,循环就会停止。

(curm < 5 || (curm == 5 && curd < 4)):这个条件分为两部分,用逻辑或||连接:

curm < 5:如果当前月份小于5(即1月到4月),条件为真,循环继续。

(curm == 5 && curd < 4):如果当前是5月,并且日期小于4日,则条件也为真,循环同样继续。

这个复合条件的意思是,只要没有达到2000年5月4日这一天,循环就会继续执行。当到达5月4日时,curm == 5 && curd < 4这一条件变为假,因为curd < 4不再成立,这时外层的curm < 5条件也不成立,因为已经是5月了,所以整个循环条件变为假,循环停止。

通用写法

while ((curYear < 给定年份) ||

       (curYear == 给定年份 && curMonth < 给定月份) ||

       (curYear == 给定年份 && curMonth == 给定月份 && curDay < 给定日子)) {

    // 执行 nextday 操作

}

代码实现

#include<bits/stdc++.h>

using namespace std;

int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool is_leap(int y){

  return y%100 && y%4==0 || y%400==0;

}

int getdays(int y,int m){

  return days[m]+(m==2 && is_leap(y));

}

void nextday(int &y,int &m,int &d){

  d++;

  if(d>getdays(y,m)){

    d=1;

    m++;

    if(m>12){

      m=1;

      y++;

    }

  }

}

int main()

{

  int cury=2000,curm=1,curd=1;

  int cnt=1;

  while(cury == 2000 && (curm < 5 || (curm == 5 && curd < 4))){

  	nextday(cury,curm,curd);

    cnt++;

  }

  cout<<cnt;

  return 0;

}

同类题型

视频讲解


⬅️ 第七届 c++ B组 省赛 🏠 00-刷题理模型 ➡️ 2、明码